// @include "../code/Browser.js"
// @include "../code/Type.js"
// @include "../code/Class.js"
// @include "../code/Array.js"
// @include "../extend/Debug.js"

/**
 * @fileOverview Canvas的基本绘画元素
 * 
 * @version qinglan_element 1.0
 * @static
 * @author wxq wxqqh@qq.com
 */
/**
 * 命名空间
 * 
 * @namespace
 * @type Object
 */
window.qinglan = window.qinglan || {};
/**
 * 基本绘画元素
 * 
 * @namespace
 * @type Object
 */
qinglan.Class.module('qinglan.Canvas.Element', function() {
	var __element_id = 1;
	var __element_prefix = '__e_';
	var eventTypeNotDefined = function(type) {
		qinglan.Debug.error('The event type :[' + type + '] is not supported by qinglan.Canvas.Element!');
	};
	var elementDeleteError = function(ele) {
		 qinglan.Debug.error('The ele with id :[' + ele.__element_id + '] delete error!!');
	};
	return {
		/**
		 * 构造函数
		 * 
		 * @param {String}
		 *            name 元素名称 默认值为空
		 */
		constructor : function(name) {
			this.name = name || '';// 元素名字
			this.__element_id = this.name
					|| (__element_prefix + __element_id++);
			this.position = new qinglan.Canvas.Vector();
			this.speed = new qinglan.Canvas.Vector();
			this.eventHandle = new qinglan.Canvas.Event(this);
			this.childElement = {};
			this.parentElement = null;
			qinglan.Canvas.Element.__ELEMENTCACHE[this.__element_id] = this;
		},
		/**
		 * 添加监听事件处理<br/> type类型是qinglan.Canvas.Element.EVENTSPORT中所定义的类型
		 * 
		 * @param {String}
		 *            type 监听事件类型
		 * @param {Function}
		 *            fun 事件触发的处理函数
		 */
		on : function(type, fun) {
			if (qinglan.Array.has(qinglan.Canvas.Element, type)) {
				return qinglan.Canvas.Event.on(this.eventHandle, type, fun);
			} else {
				eventTypeNotDefined(type);
			}
		},
		/**
		 * 删除监听事件处理 <br/> type类型是qinglan.Canvas.Element.EVENTSPORT中所定义的类型
		 * 
		 * @param {String}
		 *            type 监听事件类型
		 * @param {Function}
		 *            fun 事件触发的处理函数
		 */
		remove : function(type, fun) {
			if (qinglan.Array.has(qinglan.Canvas.Element, type)) {
				return qinglan.Canvas.Event.remove(this.eventHandle, type, fun);
			} else {
				eventTypeNotDefined(type);
			}
		},
		/**
		 * 绘制函数,所有继承于这个类的子类都必须实现这个方法
		 */
		draw : function() {
		},
		/**
		 * 绘制所有子元素函数
		 */
		drawChild : function() {
			qinglan.Array.each(this.childElement, function(element) {
						element.draw();
					});
		},
		/**
		 * 
		 */
		move : function() {
		},
		/**
		 * 销毁函数
		 */
		destroy : function() {
		},
		/**
		 * 根据ID在当前的Element搜索子元素
		 * 
		 * @param {String}
		 *            eleId 元素的ID
		 * @return {qinglan.Canvas.Element} Element实例
		 */
		getElementById : function(eleId) {
			return this.childElement[eleId] || eleId;
		},
		/**
		 * 增加子元素
		 * 
		 * @param {qinglan.Canvas.Element}
		 *            element Element实例
		 */
		appendChild : function(element) {
			this.childElement[element.__element_id] = element;
			element.parentElement = this;
		},
		/**
		 * 删除子元素
		 * 
		 * @param {qinglan.Canvas.Element}
		 *            element Element实例
		 */
		removeChild : function(element) {
			try {
				if (this.childElement[element.__element_id]) {
					delete this.childElement[element.__element_id];
				} else {
					elementDeleteError(element);
				}
			} catch (e) {
				this.childElement[element.__element_id] = null;
				elementDeleteError(element);
			}
		},
		/**
		 * 代替子元素
		 * 
		 * @param {qinglan.Canvas.Element}
		 *            element Element实例
		 * @param {qinglan.Canvas.Element}
		 *            target Element实例,需要被代替的元素
		 */
		replaceChild : function(element, target) {
		}
	};
}, function() {
	return {
		/**
		 * 所有Element的缓存地方
		 * 
		 * @field
		 * @private
		 * @type {Object}
		 */
		__ELEMENTCACHE : {},
		/**
		 * Element类所支持的事件类型 *
		 * 
		 * @type {Array}
		 * @field
		 * @static
		 * @public
		 */
		EVENTSPORT : ['move', 'destroy', 'draw'],
		/**
		 * 根据ID在全局范围內搜索子元素
		 * 
		 * @param {String}
		 *            eleId 元素的ID
		 * @return {qinglan.Canvas.Element} Element实例
		 */
		getElementById : function(eleId) {
			return this.__ELEMENTCACHE[eleId] || eleId;
		}
	};
});